package api

import (
	"bytes"
	"encoding/json"
	"github.com/gin-gonic/gin"
	"net/http"
)

// R 统一返回风格
type R struct {
	Code string      `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

func Ok(data interface{}) *R {
	r := new(R)
	r.Code = "0"
	r.Data = data
	r.Msg = "success"
	return r
}

func Error(errMsg string) *R {
	r := new(R)
	r.Code = "1"
	r.Msg = errMsg
	return r
}

func (r *R) Json() string {
	marshal, _ := json.Marshal(r)
	decoder := json.NewDecoder(bytes.NewReader(marshal))
	decoder.UseNumber()
	var jsonS string
	err := decoder.Decode(&jsonS)
	if err != nil {
		return ""
	}
	return jsonS
}

func (r *R) SetCode(code string) *R {
	r.Code = code
	return r
}

func (r *R) SetMsg(msg string) *R {
	r.Msg = msg
	return r
}

func (r *R) SetData(data interface{}) *R {
	r.Data = data
	return r
}

func TokenError() *R {
	r := new(R)
	r.Code = "5501"
	r.Msg = "请重新登"
	return r
}

func AbortWithStatusJSON200(c *gin.Context, r *R) {
	c.AbortWithStatusJSON(http.StatusOK, r)
}
